/**
 * 560. 和为 K 的子数组
 * https://leetcode-cn.com/problems/subarray-sum-equals-k/
 */

/**
 * 思路：将计算和的过程转换成计算差
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
function subarraySum(nums, k) {
  let sum = 0;
  const cache = new Map();
  cache.set(0, 1);
  let count = 0;
  for (let i = 0; i < nums.length; i += 1) {
    sum += nums[i];
    const pre = sum - k;
    if (cache.has(pre)) {
      count += cache.get(pre);
    }
    cache.set(sum, (cache.get(sum) || 0) + 1);
  }
  return count;
}

console.log(subarraySum([1, 1, 1], 2) === 2);
console.log(subarraySum([1, 2, 3], 3) === 2);
